STM32 独立看门狗实验
项目说明
STM32内部有两个看门狗电路,一个独立看门狗电路,一个窗口看门狗电路。使用看门狗电路可以防止单片机程序跑飞。看门狗是一个硬件模块,可以理解为一个计数器,这个计数器有一个输入为重置,用于处理器向其写入数据;还有一个输出值,连接到处理器,用于向处理器复位。
知识点
- 1、STM32 的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
- 2、看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
- 3、STM32内部的独立看门狗电路主要有三个寄存器,一个寄存器为IWDG_KR,这个寄存器主要是用于控制的,通过写入三条指令来控制,包括0XAAAA用于复位,重载看门狗的计数值;包括0X5555,允许访问其他的两个寄存器(PR)和(RLR);0XCCCC启动看门狗。
- 4、看门狗的两个寄存器,PR寄存器用于设置分频系数,RLR用于设置计数初值。通过这两个寄存器的时间可以设置看门狗的溢出时间。只要在单片机溢出时间内复位看门狗计数值,看门狗就不会输出复位值。
部分代码
- 1、设置看门狗电路。看门狗电路一旦启用就不能关闭,除非重启,而且重启后不能再次打开。
void iwdg_init() //独立看门狗初始化配置
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能寄存器,写功能
IWDG_SetPrescaler(IWDG_Prescaler_64);//设置IWDG预分频值//40K/64=1.6ms
IWDG_SetReload(800);//设置IWDG重装载值 12位的(0~4095)//800*1.6ms=1.28s
IWDG_ReloadCounter();//按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable();//使能IWDG
}
- 2、主函数。只要在看门狗的溢出时间内重置看门狗的计数值,就不会重置函数,也就不会输出前两条语句。
int main()
{
printf_init(); //printf初始化
iwdg_init(); //独立看门狗初始化配置
printf("cyang.tech\r\n");
printf("hello world!\r\n");
while(1)
{
IWDG_ReloadCounter(); //喂狗的时间是1.28s
printf("进入喂狗模式\r\n");
delay_ms(1000); //只要在喂狗时间内喂狗就不会让系统以为死机进入复位状态
}
}